<?php if (!defined('BASEPATH'))exit('No direct script access allowed');

include_once 'main.php';
include_once 'config.php';

/**
 * Controller para ações de multa
 * 
 * @author Douglas Rafael
 * @package controllers     
 */
class Multa extends Main {

    public function __construct() {
        parent::__construct();
        //Verifica se o usuário estar logado no sistema
        $this->verificaLogado();
        
        // Carrega class nescessárias
        $this->load->model('DAOMulta');
        $this->load->helper('text');

        //Seta propriedades do template
        $arr_js = $this->config->item('js');
        array_push($arr_js, 'maskedinput');
        array_push($arr_js, 'jquery.maskMoney');
        $this->template->load_js($arr_js);
        $this->template->set('title', 'Cadastro de Multa || ' . $this->title);
        $this->template->set('page_title', 'Cadastro de Multa');
        $this->template->set('page_infor', '<h2 class="title-infor">informações gerais</h2>
                        <p>Cadastre quantas multas desejar. Não exitem limites...</p>
                        <p>Quando a multa for paga, atualize o status para <span class="bold">INATIVO</span> e informe a data em que o pagamento foi efetuado. Assim, o valor cobrado será creditado na caixa de entrada.</p>
                        <p><span class="bold">ALT + N Abre o formulário para cadastrar uma nova multa.</span></p>
                        <p><span class="bold">ESC</span> Fecha o formulário.</p>
                        <p><span class="bold">Duplo clique</span> sobre o registro, abre formulário para edição dos dados.</p>');
    }

    public function index() {
        $this->listar();
    }

    /**
     * Carrega a view com a lista de multas
     */
    public function listar() {
        try {
            $this->verificaPermissao(ControleAcesso::CONSULTAR_MULTA);
            // Removendo a variavel 'searchterm' da sessão
            $this->session->unset_userdata('searchterm');

            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $multas = $this->DAOMulta->select_all_fines($init, $total_pagina, $this->order_by, $this->direction);
            $total_rows = $this->DAOMulta->amount_all_fines();
            
            // paginação
            $config['uri_segment'] = 6;
            $config['base_url'] = base_url() . "multa/listar/" . $this->order_by_name . '/' . $this->direction_name . '/' . $total_pagina;
            $config['total_rows'] = $total_rows;
            $config['per_page'] = $total_pagina;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['multas'] = $multas;
            $data['quant_list'] = $total_pagina;

            $this->template->load(NULL, 'multa_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_fine();
        }
    }
    
    
    /**
     * Retorna via json a multa selecionada
     */
    public function get_fine_json() {
        try {
            $this->load->library('form_validation');
            $this->form_validation->set_rules("idMulta", "Código", "trim|required|min_length[6]|max_length[6]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                echo validation_errors();
            } else {
                $multa = new TOMulta();
                $multa->id = $this->input->post('idMulta', TRUE);

                $data['multa'] = $this->DAOMulta->get_fine($multa);
                $data['multa']->data_cobranca = format_date($data['multa']->data_cobranca, FALSE);
                $data['multa']->data_pagamento = $data['multa']->data_pagamento != NULL ? format_date($data['multa']->data_pagamento, FALSE) : '';
                // Emprestimos do usuário
                $this->load->model('DAOEmprestimo');
                $emprestimos_user = $this->DAOEmprestimo->get_loans_user($data['multa']->usuario->id);
                $emprestimos = array();
                foreach ($emprestimos_user as $key => $value) {
                    $status = $this->DAOEmprestimo->check_status_loan($value, 1);
                    $emprestimos[$value->id] = 'Código: ' . $value->id . ' | Saída: ' . format_date($value->data_saida, FALSE) . ' | Retorno: ' . format_date($value->data_retorno, FALSE) . ' | Status: ' . strtoupper($status);
                }
                $data['emprestimos_user'] = form_dropdown('emprestimo', $emprestimos, set_value('emprestimo', $data['multa']->emprestimo->id, TRUE), 'id="emprestimo"');

                echo json_encode($data);
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_fine();
        }
    }
    
    /**
     * Retorna via json o historico completo dos valores das multas
     */
    public function get_history_fine_json() {
        try {
            $this->load->library('form_validation');
            
                // seleciona os totais de multas que já foram pagas, agrupados por mês e ano
                $fines_inactive = $this->DAOMulta->sum_all_fine_group(TOMulta::MULTA_INATIVA); 
                // seleciona os totais de multas que ainda não foram pagas, agrupados por mês e ano
                $fines_active = $this->DAOMulta->sum_all_fine_group(TOMulta::MULTA_ATIVA); 
                // Anos em que houve multas
                $anos = $this->DAOMulta->fine_all_year();

                $tag_vazio = '-- -- -- --';
                $row = '';
                $data = array();
                
                foreach ($anos as $ano) {
                    // Array contendo os meses do ano para as multas inativas
                    $mes_inactive = array(1 => $tag_vazio, 2 => $tag_vazio, 3 => $tag_vazio, 4 => $tag_vazio, 5 => $tag_vazio, 6 => $tag_vazio,
                        7 => $tag_vazio, 8 => $tag_vazio, 9 => $tag_vazio, 10 => $tag_vazio, 11 => $tag_vazio, 12 => $tag_vazio);
                    
                    foreach ($fines_inactive as $fine){
                        switch ($fine->mes){
                            case ( $fine->mes == 1  && $fine->ano == $ano->ano ) : $mes_inactive[1]  = $fine->valor; continue;
                            case ( $fine->mes == 2  && $fine->ano == $ano->ano ) : $mes_inactive[2]  = $fine->valor; continue;
                            case ( $fine->mes == 3  && $fine->ano == $ano->ano ) : $mes_inactive[3]  = $fine->valor; continue;
                            case ( $fine->mes == 4  && $fine->ano == $ano->ano ) : $mes_inactive[4]  = $fine->valor; continue;
                            case ( $fine->mes == 5  && $fine->ano == $ano->ano ) : $mes_inactive[5]  = $fine->valor; continue;
                            case ( $fine->mes == 6  && $fine->ano == $ano->ano ) : $mes_inactive[6]  = $fine->valor; continue;
                            case ( $fine->mes == 7  && $fine->ano == $ano->ano ) : $mes_inactive[7]  = $fine->valor; continue;
                            case ( $fine->mes == 8  && $fine->ano == $ano->ano ) : $mes_inactive[8]  = $fine->valor; continue;
                            case ( $fine->mes == 9  && $fine->ano == $ano->ano ) : $mes_inactive[9]  = $fine->valor; continue;
                            case ( $fine->mes == 10 && $fine->ano == $ano->ano ) : $mes_inactive[10] = $fine->valor; continue;
                            case ( $fine->mes == 11 && $fine->ano == $ano->ano ) : $mes_inactive[11] = $fine->valor; continue;
                            case ( $fine->mes == 12 && $fine->ano == $ano->ano ) : $mes_inactive[12] = $fine->valor; continue;
                        }
                    } 
                    // Linha das multas com status INATIVO (multas pagas)
                    $row .= "<tr class='line_up'>
                             <td rowspan='2' class='fine_year'>$ano->ano</td>
                             <td class='fine_up'></td>";
                    for ($i=1; $i <=12; $i++){
                        $row .= '<td>' . $mes_inactive[$i] . '</td>';
                    }
                    
                    $total_inact = $this->DAOMulta->sum_fine_period(NULL, $ano->ano, TOMulta::MULTA_INATIVA);
                    $total_inactive = $total_inact == NULL ? $tag_vazio : 'R$ ' . $total_inact; 
                    $row .=  "<td class='total_fine'>$total_inactive</td>";
                        
                    // Array contendo os meses do ano para as multas ativas
                    $mes_active = array(1 => $tag_vazio, 2 => $tag_vazio, 3 => $tag_vazio, 4 => $tag_vazio, 5 => $tag_vazio, 6 => $tag_vazio,
                        7 => $tag_vazio, 8 => $tag_vazio, 9 => $tag_vazio, 10 => $tag_vazio, 11 => $tag_vazio, 12 => $tag_vazio);       
                    
                    foreach ($fines_active as $fine2){
                        switch ($fine2->mes){
                            case ( $fine2->mes == 1  && $fine2->ano == $ano->ano ) : $mes_active[1]  = $fine2->valor; continue;
                            case ( $fine2->mes == 2  && $fine2->ano == $ano->ano ) : $mes_active[2]  = $fine2->valor; continue;
                            case ( $fine2->mes == 3  && $fine2->ano == $ano->ano ) : $mes_active[3]  = $fine2->valor; continue;
                            case ( $fine2->mes == 4  && $fine2->ano == $ano->ano ) : $mes_active[4]  = $fine2->valor; continue;
                            case ( $fine2->mes == 5  && $fine2->ano == $ano->ano ) : $mes_active[5]  = $fine2->valor; continue;
                            case ( $fine2->mes == 6  && $fine2->ano == $ano->ano ) : $mes_active[6]  = $fine2->valor; continue;
                            case ( $fine2->mes == 7  && $fine2->ano == $ano->ano ) : $mes_active[7]  = $fine2->valor; continue;
                            case ( $fine2->mes == 8  && $fine2->ano == $ano->ano ) : $mes_active[8]  = $fine2->valor; continue;
                            case ( $fine2->mes == 9  && $fine2->ano == $ano->ano ) : $mes_active[9]  = $fine2->valor; continue;
                            case ( $fine2->mes == 10 && $fine2->ano == $ano->ano ) : $mes_active[10] = $fine2->valor; continue;
                            case ( $fine2->mes == 11 && $fine2->ano == $ano->ano ) : $mes_active[11] = $fine2->valor; continue;
                            case ( $fine2->mes == 12 && $fine2->ano == $ano->ano ) : $mes_active[12] = $fine2->valor; continue;
                        }
                    }     
                        
                    // Linha das multas com status ATIVO (multas a serem pagas)    
                    $row .= "<tr class='line_down'>
                             <td class='fine_alert'></td>";
                    for ($i=1; $i <=12; $i++){
                        $row .= '<td>' . $mes_active[$i] . '</td>';
                    }
                    $total_act = $this->DAOMulta->sum_fine_period(NULL, $ano->ano, TOMulta::MULTA_ATIVA);
                    $total_active = $total_act == NULL ? $tag_vazio : 'R$ ' . $total_act; 
                    $row .=  "<td class='total_fine'>$total_active </td>";
                }
                
                $data['enquiries_table'] = $row; // Multa Finalizada
                $total_pago = $this->DAOMulta->sum_fine_period(NULL, NULL, TOMulta::MULTA_INATIVA);
                $data['total_pago']  = $total_pago != NULL ? $total_pago : '00.00';
                $total_nao_pagp = $this->DAOMulta->sum_fine_period(NULL, NULL, TOMulta::MULTA_ATIVA);
                $data['total_nao_pago']  = $total_nao_pagp != NULL ? $total_nao_pagp : '00.00';
                $this->load->model('DAOConfig');
                $data['periodo']  = $this->DAOConfig->get_temp_system();
                

                echo json_encode($data);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_fine();
        }
    }
    
    /**
     * Cadastra multa
     * 
     * @throws ExceptionValidacao
     */
    public function cadastrar() {
        try {
            $this->verificaPermissao(ControleAcesso::CADASTRAR_MULTA);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("tipo_multa", "Tipo de multa", "trim|required|exact_lenght[1]|xss_clean");
            $this->form_validation->set_rules("usuario_id", "Usuário", "trim|required|min_length[6]|is_natural_no_zero|xss_clean");
            $this->form_validation->set_rules("usuario", "Usuário", "trim|required|xss_clean");
            $this->form_validation->set_rules("valor", "Valor", "trim|required|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|required|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("data_cobranca", "Data da cobrança", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|required|is_natural|exact_lenght[1]|xss_clean");
            $this->input->post('status', TRUE) == TOMulta::MULTA_INATIVA ? $this->form_validation->set_rules("data_pagamento", "Data do pagamento", "trim|required|valid_date|xss_clean") : '';
            $tipo_multa = $this->input->post('tipo_multa', TRUE);
            $tipo_multa != TOMulta::TIPO_OUTRO ? $this->form_validation->set_rules("emprestimo", "Empréstimo", "trim|required|is_natural_no_zero|exact_lenght[6]|xss_clean") : '';                

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $multa = new TOMulta();
                $multa->valor = $this->input->post('valor', TRUE);
                $multa->descricao = $this->input->post('descricao', TRUE);
                $multa->data_cobranca = format_date($this->input->post('data_cobranca', TRUE));
                $multa->status = $this->input->post('status', TRUE);
                $multa->data_pagamento = $multa->status == TOMulta::MULTA_INATIVA ? format_date($this->input->post('data_pagamento', TRUE)) : NULL;
                $multa->usuario = new TOUsuario();
                $multa->usuario->id = $this->input->post('usuario_id', TRUE);
                $multa->usuario->nome = $this->input->post('usuario', TRUE);
                $multa->usuario_admin = new TOUsuario();
                $multa->usuario_admin->id = $this->get_user_logged();
                $multa->emprestimo = new TOEmprestimo();
                $multa->emprestimo->id = $tipo_multa != TOMulta::TIPO_OUTRO ? $this->input->post('emprestimo', TRUE) : NULL;
                
                $this->DAOMulta->insert_fine($multa);

                Mensagem::setMensagemSucesso("Multa para o usuário: <span class='bold'>" . $multa->usuario->nome . "</span> cadastrada com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Atualiza dados dda multa
     * 
     * @throws ExceptionValidacao
     */ 
    public function atualizar() {
        try {
            $this->verificaPermissao(ControleAcesso::ATUALIZAR_MULTA);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("tipo_multa", "Tipo de multa", "trim|required|exact_lenght[1]|xss_clean");            
            $this->form_validation->set_rules("codigo", "Código", "trim|required|is_natural|exact_lenght[6]|xss_clean");
            $this->form_validation->set_rules("usuario", "Usuário", "trim|xss_clean");
            $this->form_validation->set_rules("valor", "Valor", "trim|required|xss_clean");
            $this->form_validation->set_rules("descricao", "Descrição", "trim|required|min_length[5]|max_length[245]|xss_clean");
            $this->form_validation->set_rules("data_cobranca_ori", "Data da cobrança", "trim|valid_date|xss_clean");
            $this->form_validation->set_rules("data_cobranca", "Data da cobrança", "trim|required|valid_date|xss_clean");
            $this->form_validation->set_rules("status", "Status", "trim|required|is_natural|exact_lenght[1]|xss_clean");
            $this->input->post('status', TRUE) == TOMulta::MULTA_INATIVA ? $this->form_validation->set_rules("data_pagamento", "Data do pagamento", "trim|required|valid_date|xss_clean") : '';
            $tipo_multa = $this->input->post('tipo_multa', TRUE);
            $tipo_multa != TOMulta::TIPO_OUTRO ? $this->form_validation->set_rules("emprestimo", "Empréstimo", "trim|required|is_natural_no_zero|exact_lenght[6]|xss_clean") : '';                


            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $data_cobranca_ori = $this->input->post('data_cobranca_ori', TRUE);
                $data_cobranca_atual = $this->input->post('data_cobranca', TRUE);
                $data_pagamento_ori = $this->input->post('data_pagamento_ori', TRUE);
                $data_pagamento_atual = $this->input->post('data_pagamento', TRUE);

                $multa = new TOMulta();
                $multa->id = $this->input->post('codigo', TRUE);
                $multa->valor = $this->input->post('valor', TRUE);
                $multa->descricao = $this->input->post('descricao', TRUE);
                // Verifica se a data de cobranca digitada é diferente da já salva
                $multa->data_cobranca = $data_cobranca_atual != $data_cobranca_ori ? format_date($data_cobranca_atual, FALSE, TRUE) : NULL;
                $multa->status = $this->input->post('status', TRUE);
                // Verifica se existe data de cobranca e se data digitada é diferente da já salva
                if ($multa->status == TOMulta::MULTA_INATIVA)
                    $multa->data_pagamento = $data_pagamento_atual != $data_pagamento_ori ? format_date($data_pagamento_atual, FALSE, TRUE) : NULL;
                else if($multa->status == TOMulta::MULTA_ATIVA)
                    $multa->data_pagamento = NULL;
                $multa->usuario = new TOUsuario();
                $multa->usuario->nome = $this->input->post('usuario', TRUE);
                $multa->emprestimo = new TOEmprestimo();
                $multa->emprestimo->id = $tipo_multa != TOMulta::TIPO_OUTRO ? $this->input->post('emprestimo', TRUE) : NULL;
                
                $this->DAOMulta->update_fine($multa);

                Mensagem::setMensagemSucesso("Multa para o usuário: <span class='bold'>" . $multa->usuario->nome . "</span> atualizada com sucesso!");
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }
    
    
    /**
     * Busca por multas
     */
    public function buscar() {
        try {
            $searchterm = $this->searchtermHandler($this->input->get_post('search_term', TRUE));
            $init = ($this->uri->segment(6)) ? $this->uri->segment(6) : 0;
            $this->treat_orderby();

            $total_pagina = $this->uri->segment(5) ? $this->uri->segment(5) : 10;
            $multas = $this->DAOMulta->search_fine($init, $total_pagina, $searchterm, $this->order_by, $this->direction);
            $total_rows = $this->DAOMulta->amount_search_fine($searchterm);

            //paginação
            $config['uri_segment'] = 6;
            $config['per_page'] = $total_pagina;
            $config['base_url'] = base_url() . "multa/buscar/" . $this->order_by_name . "/" . $this->direction_name . "/". $total_pagina;
            $config['total_rows'] = $total_rows;
            $this->pagination->initialize($config);

            //data
            $data['total_rows'] = $this->treat_number_rows($total_rows);
            $data['pagination'] = $this->pagination->create_links();
            $data['multas'] = $multas;
            $data['quant_list'] = $total_pagina;

            if ($total_rows == 0)
                Mensagem::setMensagem("Nenhum registro foi encontrado para esta pesquisa: <span class='bold'> $searchterm </span>", "aviso");

            $this->template->load(NULL, 'multa_list', $data, FALSE, TRUE);
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->listar();
        }
    }
    
    
    /**
     * Exclui multa
     */
    public function excluir() {
        try {
            $this->verificaPermissao(ControleAcesso::EXCLUIR_GRUPO);
            $this->load->library('form_validation');
            $this->form_validation->set_rules("codigoDelete", "Código", "trim|required|xss_clean");
            $this->form_validation->set_rules("nomeDelete", "Nome", "trim|min_length[2]|xss_clean");

            if ($this->form_validation->run() == FALSE) {
                throw new ExceptionValidacao(validation_errors());
            } else {
                $multa = new TOMulta();
                $multa->id = explode(',', $this->input->post('codigoDelete', TRUE));
                $multa->usuario = new TOUsuario();
                $multa->usuario->nome = $this->input->post('nomeDelete', TRUE);

                $this->DAOMulta->delete_fine($multa);

                if($multa->usuario->nome != NULL){
                    $message = "<p>Multa de código: <span class='bold'>" . $multa->id[0] . "</span> aplicada ao usuário: <span class='bold'>" . $multa->usuario->nome . "</span> excluída com sucesso!</p><p class='bold'>Se o valor cobrado foi pago, o mesmo foi retirado da caixa de entrada.</p>";
                }else{
                    $message = "<p>Multas excluídas com sucesso!</p><p class='bold'>Se o valor cobrado foi pago, o mesmo foi retirado da caixa de entrada.</p>";
                }

                Mensagem::setMensagemSucesso($message);
                
                $this->index();
            }
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->index();
        }
    }

    
    private function view_list_fine() {
        $this->template->load(NULL, 'usuario_list');
    }
    
    
    public function set_auto_multa() {
        try {
            $this->set_auto_multa();
        } catch (Exception $erro) {
            Mensagem::setExcecao($erro);
            $this->view_list_fine();
        }
    }

}
